﻿#region Código Gerado Pela Fábrica de Software (Using)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using itau.im.entidade;
using itau.im.dado;
using EnterpriseLibraryWrapper;
using System.ServiceModel;
#endregion

#region Código Gerado Pela Fábrica de Software (Namespace)
namespace itau.im.negocio
{
    #region Código Gerado Pela Fábrica de Software (Classe)

    public class ProdutoFinanceiroBS : IProdutoFinanceiroBS
    {
        #region Código Gerado Pela Fábrica de Software (Métodos)

        public ProdutoFinanceiro ObterArvoreProdutoDerivado(int codigoCurva, int codigoGrupoParametros)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;
            IRegraAtribuicaoDAO objRegraAtribuicaoDAO = null;

            try
            {
                objRegraAtribuicaoDAO = DaoFactory.getRegraAtribuicaoDAO();
                RegraAtribuicaoCurva regra = objRegraAtribuicaoDAO.ObterRegraVigente(codigoCurva, codigoGrupoParametros);

                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                return produtoFinanceiroDAO.ObterArvoreProdutoDerivado(regra.CodigoProdutoFinanceiroAlocado);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
                objRegraAtribuicaoDAO = null;
            }

            return new ProdutoFinanceiro();
        }

        public IList<FamiliaProdutoFinanceiro> ObterFamiliaProdutoFinanceiroPorCodigoClasseProduto(int codigoClasseProduto)
        {
            IList<FamiliaProdutoFinanceiro> listasFamiliasProdutosFinanceiros = null;
            IProdutoFinanceiroDAO produtoFinanceiroDAO;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                listasFamiliasProdutosFinanceiros = produtoFinanceiroDAO.ObterFamiliasProdutoFinanceiroPorCodigoClasseProduto(codigoClasseProduto);

                return listasFamiliasProdutosFinanceiros;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listasFamiliasProdutosFinanceiros = null;
                produtoFinanceiroDAO = null;
            }

            return new List<FamiliaProdutoFinanceiro>();
        }

        public void AtualizarFamiliaProdutoFinanceiro(FamiliaProdutoFinanceiro familiaProduto)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                produtoFinanceiroDAO.AtualizarFamiliaProdutoFinanceiro(familiaProduto);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
            }
        }

        public IList<ProdutoFinanceiro> ObterProdutosFinanceiros()
        {
            IList<ProdutoFinanceiro> listasProdutosFinanceiros = null;
            IProdutoFinanceiroDAO produtoFinanceiroDAO;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                listasProdutosFinanceiros = produtoFinanceiroDAO.ObterProdutosFinanceiros();

                return listasProdutosFinanceiros;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listasProdutosFinanceiros = null;
                produtoFinanceiroDAO = null;
            }

            return new List<ProdutoFinanceiro>();
        }

        public void CriarClasseProdutoFinanceiro(ClasseProdutoFinanceiro classeProdutoFinanceiro)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                produtoFinanceiroDAO.CriarClasseProdutoFinanceiro(classeProdutoFinanceiro);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
            }
        }

        public void ExcluirClasseProdutoFinanceiro(int classeProdutoFinanceiroID)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                produtoFinanceiroDAO.ExcluirClasseProdutoFinanceiro(classeProdutoFinanceiroID);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
            }
        }

        public IList<ProdutoFinanceiro> ObterProdutoFinanceiroPorCodigoFamiliaProduto(int codigoFamiliaProdutoID)
        {
            IList<ProdutoFinanceiro> listaProdutoFinanceiro = null;
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                listaProdutoFinanceiro = produtoFinanceiroDAO.ObterProdutoFinanceiroPorCodigoFamiliaProduto(codigoFamiliaProdutoID);

                return listaProdutoFinanceiro;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listaProdutoFinanceiro = null;
                produtoFinanceiroDAO = null;
            }

            return new List<ProdutoFinanceiro>();
        }

        public FamiliaProdutoFinanceiro ObterFamiliaProdutoFinanceiro(int codigoFamilia)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;
            FamiliaProdutoFinanceiro familiaProduto = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                familiaProduto = produtoFinanceiroDAO.ObterFamiliaProdutoFinanceiro(codigoFamilia);
                return familiaProduto;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
                familiaProduto = null;
            }

            return new FamiliaProdutoFinanceiro();
        }

        public IList<ClasseProdutoFinanceiro> ObterClassesProdutoFinanceiro()
        {
            IList<ClasseProdutoFinanceiro> listaClassesProdutoFinanceiro = null;
            IProdutoFinanceiroDAO ProdutoFinanceiroDAO = null;

            try
            {
                ProdutoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                listaClassesProdutoFinanceiro = ProdutoFinanceiroDAO.ObterClassesProdutoFinanceiro();
                return listaClassesProdutoFinanceiro;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listaClassesProdutoFinanceiro = null;
                ProdutoFinanceiroDAO = null;
            }

            return new List<ClasseProdutoFinanceiro>();
        }

        public void CriarFamiliaProdutoFinanceiro(FamiliaProdutoFinanceiro familia)
        {
            IProdutoFinanceiroDAO ProdutoFinanceiroDAO = null;

            try
            {
                ProdutoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                ProdutoFinanceiroDAO.CriarFamiliaProdutoFinanceiro(familia);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                ProdutoFinanceiroDAO = null;
            }
        }

        public void ExcluirFamiliaProdutoFinanceiro(int familiaProdutoID)
        {
            IProdutoFinanceiroDAO ProdutoFinanceiroDAO = null;

            try
            {
                ProdutoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                ProdutoFinanceiroDAO.ExcluirFamiliaProdutoFinanceiro(familiaProdutoID);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                ProdutoFinanceiroDAO = null;
            }
        }

        public ClasseProdutoFinanceiro ObterClasseProdutoFinanceiro(int codigoClasse)
        {
            ClasseProdutoFinanceiro classeProduto = null;
            IProdutoFinanceiroDAO ProdutoFinanceiroDAO = null;

            try
            {
                classeProduto = new ClasseProdutoFinanceiro();
                ProdutoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                classeProduto = ProdutoFinanceiroDAO.ObterClasseProdutoFinanceiro(codigoClasse);

                return classeProduto;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                classeProduto = null;
                ProdutoFinanceiroDAO = null;
            }

            return new ClasseProdutoFinanceiro();

        }

        public void AtualizarClasseProdutoFinanceiro(ClasseProdutoFinanceiro classeProduto)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                produtoFinanceiroDAO.AtualizarClasseProdutoFinanceiro(classeProduto);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
            }
        }

        public IList<ProdutoFinanceiroDerivado> ObterProdutosDerivadosPorProduto(int codigoProduto)
        {
            IList<ProdutoFinanceiroDerivado> listasProdutosFinanceirosDerivados = null;

            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                listasProdutosFinanceirosDerivados = produtoFinanceiroDAO.ObterProdutosDerivadosPorProduto(codigoProduto);

                return listasProdutosFinanceirosDerivados;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listasProdutosFinanceirosDerivados = null;
                produtoFinanceiroDAO = null;
            }

            return new List<ProdutoFinanceiroDerivado>();
        }

        public IList<ProdutoFinanceiroDerivado> ObterProdutosDerivados()
        {
            IList<ProdutoFinanceiroDerivado> listasProdutosFinanceirosDerivados = null;
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                listasProdutosFinanceirosDerivados = produtoFinanceiroDAO.ObterProdutosDerivadosPorIndicadorRegistroAtivo(1);

                return listasProdutosFinanceirosDerivados;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listasProdutosFinanceirosDerivados = null;
                produtoFinanceiroDAO = null;
            }

            return new List<ProdutoFinanceiroDerivado>();
        }

        public IList<ProdutoFinanceiroDerivado> ObterProdutosDerivadosInativos()
        {
            IList<ProdutoFinanceiroDerivado> listasProdutosFinanceirosDerivados = null;
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                listasProdutosFinanceirosDerivados = produtoFinanceiroDAO.ObterProdutosDerivadosPorIndicadorRegistroAtivo(0);

                return listasProdutosFinanceirosDerivados;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listasProdutosFinanceirosDerivados = null;
                produtoFinanceiroDAO = null;
            }

            return new List<ProdutoFinanceiroDerivado>();
        }

        public IList<ProdutoFinanceiroDerivado> ObterProdutosDerivadosPorCodigoGRNome(int codigoProdutoFinanceiroDerivado, string codigoProdutoFinanceiroGR, string nomeProdutoFinanceiroDerivado)
        {
            IList<ProdutoFinanceiroDerivado> listasProdutosFinanceirosDerivados = null;
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                listasProdutosFinanceirosDerivados = produtoFinanceiroDAO.ObterProdutosDerivadosPorCodigoGRNome(codigoProdutoFinanceiroDerivado, codigoProdutoFinanceiroGR, nomeProdutoFinanceiroDerivado);

                return listasProdutosFinanceirosDerivados;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listasProdutosFinanceirosDerivados = null;
                produtoFinanceiroDAO = null;
            }

            return new List<ProdutoFinanceiroDerivado>();
        }

        public IList<FamiliaProdutoFinanceiro> ObterFamiliasProdutoFinanceiro()
        {
            IList<FamiliaProdutoFinanceiro> listasFamiliasProdutosFinanceiros = null;

            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                listasFamiliasProdutosFinanceiros = produtoFinanceiroDAO.ObterFamiliasProdutoFinanceiro();
                return listasFamiliasProdutosFinanceiros;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listasFamiliasProdutosFinanceiros = null;
                produtoFinanceiroDAO = null;
            }

            return new List<FamiliaProdutoFinanceiro>();
        }

        public void CriarProdutoFinanceiro(ProdutoFinanceiro produtoFinanceiro)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;

            try
            {
                produtoFinanceiro.IndicadorRegistroAtivo = 1;
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                produtoFinanceiroDAO.CriarProdutoFinanceiro(produtoFinanceiro);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
            }
        }

        public IList<ProdutoFinanceiro> ObterProdutoFinanceiroComProdutosDerivadosAssociados(IList<ProdutoFinanceiro> listaProdutoFinanceiro)
        {
            IProdutoFinanceiroDAO ProdutoFinanceiroDAO = null;
            ProdutoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
            List<ProdutoFinanceiro> listaResultado = new List<ProdutoFinanceiro>();

            try
            {
                foreach (ProdutoFinanceiro objProdutoFinanceiro in listaProdutoFinanceiro)
                {
                    IList<ProdutoFinanceiroDerivado> listaProdutoFinanceiroDerivado;
                    listaProdutoFinanceiroDerivado = ProdutoFinanceiroDAO.ObterProdutosDerivadosPorProduto(objProdutoFinanceiro.CodigoProdutoFinanceiro);
                    objProdutoFinanceiro.ProdutoFinanceiroDerivado = listaProdutoFinanceiroDerivado;
                    listaResultado.Add(objProdutoFinanceiro);
                }

                return listaResultado;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                ProdutoFinanceiroDAO = null;
                listaResultado = null;
            }

            return new List<ProdutoFinanceiro>();
        }

        public void ExcluirProdutoFinanceiro(ProdutoFinanceiro produtoFinanceiro)
        {

            IProdutoFinanceiroDAO produtoFinanceiroDAO;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                produtoFinanceiroDAO.ExcluirProdutosFinanceirosDerivados(produtoFinanceiro.ProdutoFinanceiroDerivado);

                produtoFinanceiroDAO.ExcluirProdutoFinanceiro(produtoFinanceiro);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
            }
        }

        public void AtualizarProdutoFinanceiro(ProdutoFinanceiro produtoFinanceiro)
        {

            IProdutoFinanceiroDAO produtoFinanceiroDAO;
            //IList<ProdutoFinanceiroDerivado> listaProdutosDerivados;
            //IList<ProdutoFinanceiroDerivado> listaProdutosDerivadosAlterados;
            //IList<ProdutoFinanceiroDerivado> listaProdutosDerivadosExcluidos;
            //IList<ProdutoFinanceiroDerivado> listaProdutosDerivadosCriados;
            //ProdutoFinanceiroDerivado objProdutoFinanceiroDerivado;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                //listaProdutosDerivados = new List<ProdutoFinanceiroDerivado>();
                //listaProdutosDerivadosAlterados = new List<ProdutoFinanceiroDerivado>();
                //listaProdutosDerivadosExcluidos = new List<ProdutoFinanceiroDerivado>();
                //listaProdutosDerivadosCriados = new List<ProdutoFinanceiroDerivado>();
                //objProdutoFinanceiroDerivado = new ProdutoFinanceiroDerivado();

                produtoFinanceiroDAO.AtualizarProdutoFinanceiro(produtoFinanceiro);

                //listaProdutosDerivados = produtoFinanceiroDAO.ObterProdutosDerivadosPorProduto(produtoFinanceiro.CodigoProdutoFinanceiro);

                //foreach (ProdutoFinanceiroDerivado item in listaProdutosDerivados)
                //{
                //    objProdutoFinanceiroDerivado = produtoFinanceiro.ProdutoFinanceiroDerivado.ToList().Find(new Predicate<ProdutoFinanceiroDerivado>(
                //        delegate(ProdutoFinanceiroDerivado objItem)
                //        {
                //            return (objItem.CodigoProdutoFinanceiroDerivado == item.CodigoProdutoFinanceiroDerivado);
                //        }
                //        ));

                //    if (objProdutoFinanceiroDerivado == null)
                //        listaProdutosDerivadosExcluidos.Add(item);
                //    else
                //        if (item.CodigoProdutoFinanceiroGR != objProdutoFinanceiroDerivado.CodigoProdutoFinanceiroGR ||
                //            item.NomeProdutoFinanceiroDerivado != objProdutoFinanceiroDerivado.NomeProdutoFinanceiroDerivado)
                //        {
                //            listaProdutosDerivadosAlterados.Add(objProdutoFinanceiroDerivado);
                //        }
                //}

                //foreach (ProdutoFinanceiroDerivado item in produtoFinanceiro.ProdutoFinanceiroDerivado)
                //{
                //    if (item.CodigoProdutoFinanceiroDerivado == 0)
                //        listaProdutosDerivadosCriados.Add(item);
                //}

                //if (listaProdutosDerivadosAlterados.Count != 0)
                //    produtoFinanceiroDAO.AtualizarProdutosFinanceirosDerivados(listaProdutosDerivadosAlterados);

                //if (listaProdutosDerivadosCriados.Count != 0)
                //    produtoFinanceiroDAO.CriarProdutosFinanceirosDerivados(listaProdutosDerivadosCriados);

                //if (listaProdutosDerivadosExcluidos.Count != 0)
                //    produtoFinanceiroDAO.ExcluirProdutosFinanceirosDerivados(listaProdutosDerivadosExcluidos);

            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
                //listaProdutosDerivados = null;
                //listaProdutosDerivadosAlterados = null;
                //listaProdutosDerivadosCriados = null;
                //listaProdutosDerivadosExcluidos = null;
                //objProdutoFinanceiroDerivado = null;
            }
        }

        public IList<ProdutoFinanceiroAlocacao> ObterProdutoFinanceiroAlocacaoPorProduto(int codigoProdutoFinanceiro)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO = null;
            IList<ProdutoFinanceiroAlocacao> listaAlocacaoProduto = null;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                listaAlocacaoProduto = produtoFinanceiroDAO.ObterProdutoFinanceiroAlocacaoPorProduto(codigoProdutoFinanceiro);
                return listaAlocacaoProduto;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
            }

            return new List<ProdutoFinanceiroAlocacao>();
        }

        public ProdutoFinanceiroDerivado CriarProdutoFinanceiroDerivado(ProdutoFinanceiroDerivado produtoFinanceiroDerivado)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO;
            IGrupoParametrosDAO grupoParametrosDAO;
            ProdutoFinanceiroDerivado produtoJaExistente;
            IList<ProdutoFinanceiroAlocacao> listaAlocacoes;
            Int32 codigoProdutoDerivadoNovo;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();
                //produtoJaExistente = new ProdutoFinanceiroDerivado();
                produtoJaExistente = null;

                produtoJaExistente = produtoFinanceiroDAO.ObterProdutoFinanceiroDerivadoPorCodigoGR(produtoFinanceiroDerivado.CodigoProdutoFinanceiroGR);

                if (produtoJaExistente == null || produtoJaExistente.CodigoProdutoFinanceiroGR == null || string.IsNullOrEmpty(produtoJaExistente.NomeProdutoFinanceiroDerivado))
                {
                    produtoFinanceiroDerivado.IndicadorRegistroAtivo = 1;

                    produtoFinanceiroDAO.CriarProdutoFinanceiroDerivado(produtoFinanceiroDerivado);
                    //codigoProdutoDerivadoNovo = produtoFinanceiroDAO.CriarProdutoFinanceiroDerivado(produtoFinanceiroDerivado);

                    //listaAlocacoes = produtoFinanceiroDAO.ObterProdutoFinanceiroAlocacaoPorProduto(produtoFinanceiroDerivado.CodigoProdutoFinanceiro);

                    //if (listaAlocacoes != null && listaAlocacoes.Where(m => m.DataFimVigencia == null || m.DataFimVigencia == new DateTime()).Count() > 0)
                    //{
                    //    ProdutoFinanceiroAlocacao objProdutoFinanceiroAlocacao = new ProdutoFinanceiroAlocacao();
                    //    objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiro = produtoFinanceiroDerivado.CodigoProdutoFinanceiro;
                    //    objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiroDerivado = codigoProdutoDerivadoNovo;
                    //    objProdutoFinanceiroAlocacao.CodigoGrupoParametroAtribuicao = listaAlocacoes.Where(m => m.DataFimVigencia == null || m.DataFimVigencia == new DateTime()).First().CodigoGrupoParametroAtribuicao;
                    //    objProdutoFinanceiroAlocacao.DataInicioVigenciaProduto = DateTime.Now;

                    //    grupoParametrosDAO.CriarProdutoFinanceiroAlocacao(objProdutoFinanceiroAlocacao);

                    //    return null;
                    //}
                }
                else
                {
                    return produtoJaExistente;
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
                produtoJaExistente = null;
                listaAlocacoes = null;
            }

            return new ProdutoFinanceiroDerivado();
        }

        public void ExcluirProdutoFinanceiroDerivado(ProdutoFinanceiroDerivado produtoFinanceiroDerivado)
        {
            IGrupoParametrosDAO grupoParametrosDAO;
            IProdutoFinanceiroDAO produtoFinanceiroDAO;
            IList<ProdutoFinanceiroAlocacao> listaAlocacoes;

            try
            {
                listaAlocacoes = new List<ProdutoFinanceiroAlocacao>();
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                listaAlocacoes = grupoParametrosDAO.ObterProdutoFinanceiroAlocacaoPorProdutoDerivado(produtoFinanceiroDerivado);

                if (listaAlocacoes == null || listaAlocacoes.Count == 0)
                    produtoFinanceiroDAO.ExcluirProdutoFinanceiroDerivado(produtoFinanceiroDerivado);
                else
                {
                    produtoFinanceiroDerivado.IndicadorRegistroAtivo = 0;
                    produtoFinanceiroDAO.AtualizarProdutoFinanceiroDerivado(produtoFinanceiroDerivado);

                    foreach (ProdutoFinanceiroAlocacao produtoFinanceiroAlocacao in listaAlocacoes)
                    {
                        if (produtoFinanceiroAlocacao.DataFimVigencia == DateTime.MinValue)
                        {
                            produtoFinanceiroAlocacao.DataFimVigencia = DateTime.Now;
                            grupoParametrosDAO.AtualizarProdutoFinanceiroAlocacao(produtoFinanceiroAlocacao);
                        }
                    }
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
                produtoFinanceiroDAO = null;
                listaAlocacoes = null;
            }
        }

        public void AtualizarProdutoFinanceiroDerivadoExcetoCodigoGR(ProdutoFinanceiroDerivado produtoFinaceiroDerivado)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO;

            try
            {
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();
                produtoFinanceiroDAO.AtualizarProdutoFinanceiroDerivado(produtoFinaceiroDerivado);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                produtoFinanceiroDAO = null;
            }
        }

        public bool AtualizarProdutoFinanceiroDerivadoCompleto(ProdutoFinanceiroDerivado produtoFinaceiroDerivado, string codigoGRAntigo)
        {
            IProdutoFinanceiroDAO produtoFinanceiroDAO;
            IGrupoParametrosDAO grupoParametrosDAO;
            ProdutoFinanceiroDerivado produtoFinanceiroDerivadoAntigo = new ProdutoFinanceiroDerivado();
            int codigoNovoSubproduto;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();
                produtoFinanceiroDAO = DaoFactory.getProdutoFinanceiroDAO();

                ProdutoFinanceiroDerivado ProdutoJaExistente = produtoFinanceiroDAO.ObterProdutoFinanceiroDerivadoPorCodigoGR(produtoFinaceiroDerivado.CodigoProdutoFinanceiroGR);

                if (ProdutoJaExistente == null || ProdutoJaExistente.CodigoProdutoFinanceiroGR == null)
                {
                    IList<ProdutoFinanceiroAlocacao> listaAlocacoes = grupoParametrosDAO.ObterProdutoFinanceiroAlocacaoPorProdutoDerivado(produtoFinaceiroDerivado);

                    if (listaAlocacoes == null)
                    {
                        produtoFinanceiroDAO.AtualizarProdutoFinanceiroDerivado(produtoFinaceiroDerivado);
                    }
                    else
                    {
                        produtoFinanceiroDerivadoAntigo = produtoFinanceiroDAO.ObterProdutoFinanceiroDerivadoPorCodigoGR(codigoGRAntigo);
                        produtoFinanceiroDerivadoAntigo.IndicadorRegistroAtivo = 0;
                        produtoFinanceiroDAO.AtualizarProdutoFinanceiroDerivado(produtoFinanceiroDerivadoAntigo);

                        bool _Flag = true;

                        foreach (ProdutoFinanceiroAlocacao produtoFinanceiroAlocacao in listaAlocacoes)
                        {
                            if (produtoFinanceiroAlocacao.DataFimVigencia == null || produtoFinanceiroAlocacao.DataFimVigencia.Equals(DateTime.MinValue))
                            {
                                _Flag = false;

                                DateTime dataHoraAtual = DateTime.Now;
                                produtoFinanceiroAlocacao.DataFimVigencia = dataHoraAtual;
                                grupoParametrosDAO.AtualizarProdutoFinanceiroAlocacao(produtoFinanceiroAlocacao);

                                produtoFinaceiroDerivado.IndicadorRegistroAtivo = 1;
                                produtoFinaceiroDerivado.CodigoProdutoFinanceiroDerivado = 0;
                                codigoNovoSubproduto = produtoFinanceiroDAO.CriarProdutoFinanceiroDerivado(produtoFinaceiroDerivado);

                                ProdutoFinanceiroAlocacao novoProdutoFinanceiroAlocacao = new ProdutoFinanceiroAlocacao();
                                novoProdutoFinanceiroAlocacao.CodigoGrupoParametroAtribuicao = produtoFinanceiroAlocacao.CodigoGrupoParametroAtribuicao;
                                novoProdutoFinanceiroAlocacao.CodigoProdutoFinanceiro = produtoFinanceiroAlocacao.CodigoProdutoFinanceiro;
                                novoProdutoFinanceiroAlocacao.CodigoProdutoFinanceiroDerivado = codigoNovoSubproduto;
                                novoProdutoFinanceiroAlocacao.DataInicioVigenciaProduto = dataHoraAtual;
                                novoProdutoFinanceiroAlocacao.DataFimVigencia = DateTime.MinValue;
                                grupoParametrosDAO.CriarProdutoFinanceiroAlocacao(novoProdutoFinanceiroAlocacao);
                            }
                        }

                        if (_Flag)
                        {
                            produtoFinaceiroDerivado.IndicadorRegistroAtivo = 1;
                            produtoFinaceiroDerivado.CodigoProdutoFinanceiroDerivado = 0;
                            produtoFinanceiroDAO.CriarProdutoFinanceiroDerivado(produtoFinaceiroDerivado);
                        }
                    }

                    return true;

                }
                else
                {
                    return false;
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
            }

            return false;
        }

        #endregion

    }

    #endregion

}

#endregion
